package work.zhengyun.demo.utils;

import com.gargoylesoftware.htmlunit.*;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.util.UrlUtils;

/**
 * @author zhengyun
 * @date 2019/12/17 14:51
 */
public class WebUtils {
    public static BrowserVersion getBrowserVersion() {
        BrowserVersion bv = BrowserVersion.BEST_SUPPORTED.clone();
        // 设置语言，否则不知道传过来是什么编码
        bv.setUserLanguage("zh_cn");
        bv.setSystemLanguage("zh_cn");
        bv.setBrowserLanguage("zh_cn");

        // 源码里是写死Win32的，不知道到生产环境（linux）会不会变，稳妥起见还是硬设
        bv.setPlatform("Win32");

        return bv;
    }

    public static WebClient newWebClient() {
        BrowserVersion bv=WebUtils.getBrowserVersion();
        WebClient wc = new WebClient(bv);
        wc.getOptions().setUseInsecureSSL(true); // 允许使用不安全的SSL连接。如果不打开，站点证书过期的https将无法访问
        wc.getOptions().setJavaScriptEnabled(true); //启用JS解释器
        wc.getOptions().setCssEnabled(false); //禁用css支持
        // 禁用一些异常抛出
        wc.getOptions().setThrowExceptionOnScriptError(false);
        wc.getOptions().setThrowExceptionOnFailingStatusCode(false);

        wc.getOptions().setDoNotTrackEnabled(false); // 随请求发送DoNotTrack
        wc.setJavaScriptTimeout(1000);      // 设置JS超时，这里是1s
        wc.getOptions().setTimeout(5000); //设置连接超时时间 ，这里是5s。如果为0，则无限期等待
        wc.setAjaxController(new NicelyResynchronizingAjaxController()); // 设置ajax控制器

        return wc;
    }
    public static String getTmallDetail(String url) {
        WebClient wc = newWebClient();

        String detail = "";

        try {
            WebRequest request = new WebRequest(UrlUtils.toUrlUnsafe(url));

            //request.setAdditionalHeaders(searchRequestHeader);

            wc.getCurrentWindow().getTopWindow().setOuterHeight(Integer.MAX_VALUE);
            wc.getCurrentWindow().getTopWindow().setInnerHeight(Integer.MAX_VALUE);

            Page page = wc.getPage(request);
            page.getEnclosingWindow().setOuterHeight(Integer.MAX_VALUE);
            page.getEnclosingWindow().setInnerHeight(Integer.MAX_VALUE);

            if(page.isHtmlPage()) {
                HtmlPage htmlPage = (HtmlPage) page;
                ScriptResult sr = htmlPage.executeJavaScript(String.format("javascript:window.scrollBy(0,%d);",Integer.MAX_VALUE));
                // 执行页面所有渲染相关的JS
                int left = 0;
                do {
                    left = wc.waitForBackgroundJavaScript(10);
//                    System.out.println(left);
                } while (left > 7); // 有6-7个时间超长的js任务

                htmlPage = (HtmlPage)sr.getNewPage();
                detail = htmlPage.getElementById("description").asXml();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            wc.close();
        }
        return detail;
    }
    public static void main(String[] args){
        String  detail = WebUtils.getTmallDetail("https://detail.tmall.com/item.htm?spm=a212k0.12153887.0.0.6df3687dGGo2xX&id=41727841498");
        System.out.println("=============="+detail);
    }
}
